package br.com.iswe.gwt.crud.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import junit.framework.Assert;

import org.junit.Test;

import br.com.iswe.core.entidades.gwt.BeanMap;
import br.com.iswe.core.entidades.util.ConverterHandler;
import br.com.iswe.core.web.util.BasicServiceLocator;
import br.com.iswe.core.web.util.Converter;
import br.com.iswe.core.web.util.ServiceLocator;
import br.com.iswe.test.core.entidades.util.mocks.EstadoCivil;
import br.com.iswe.test.core.entidades.util.mocks.Pessoa;
import br.com.iswe.test.core.entidades.util.mocks.Sexo;
import br.com.iswe.test.core.entidades.util.mocks.TipoDocumentoPessoa;

public class BeanMapUtilsTest {

	
	
	@Test
	public void testGetFlatProperties() {
		
	}

	@Test
	public void testAssemblyMap() {
		
	}

	@Test
	public void testGetBeanFromMap() {
		
	}
	
	@Test
	public void testGetHierarchicalMap2(){
		BeanMap mapa = new BeanMap();
		
		mapa.put("name", "Rafael Noronha");
		mapa.put("sexo.cdSexo", "1");
		mapa.put("documentoPessoa.cdDocumentoPessoa", "2");
		mapa.put("documentoPessoa.tipoDocumento.cdTipoDocumento", "3");
		
		BeanMap retorno = BeanMapUtils.getHierarchicalMap(mapa);
		
		//asserts
		Assert.assertTrue("Rafael Noronha".equals( retorno.get("name") ));
		BeanMap documentoPessoa = (BeanMap)retorno.get("documentoPessoa");
		Assert.assertTrue("2".equals( documentoPessoa.get("cdDocumentoPessoa") ));
		BeanMap tipoDocumento = (BeanMap)documentoPessoa.get("tipoDocumento");
		Assert.assertTrue("3".equals( tipoDocumento.get("cdTipoDocumento") ));
		
	}
	
	@SuppressWarnings("unchecked")
	private ServiceLocator getConverterLocatorMock() {
		//
		return new BasicServiceLocator(){
			public Converter getConverter(Class bean) {
				if(bean.equals(Sexo.class)){
					return new Converter(){
						public Object getAsObject(String valor) {
							Sexo retorno = new Sexo();
							retorno.setCdSexo(new Integer(valor));
							retorno.setDescricao("Masculino - Bean retornado do mecanismo de persistencia");
							return retorno;
						}
						public String getAsString(Object object) {
							return null;
						}
					};
				}
				else if(bean.equals(TipoDocumentoPessoa.class)){
					return new Converter(){
						
						public Object getAsObject(String valor) {
							TipoDocumentoPessoa retorno = new TipoDocumentoPessoa();
							retorno.setCdTipoDocumento(new Long(valor));
							retorno.setDescricao("TipoDocumentoPessoa - Bean retornado do mecanismo de persistencia");
							return retorno;
						}
						public String getAsString(Object object) {
							return null;
						}
					};
				}
				else{
					return new Converter(){
						public Object getAsObject(String valor) {
							EstadoCivil retorno = new EstadoCivil();
							retorno.setCdEstadoCivil(new Integer(valor));
							retorno.setDescricao("Solteiro - Bean retornado do mecanismo de persistencia");
							return retorno;
						}
						public String getAsString(Object object) {
							return null;
						}
					};
				}
			}
		};
	}
	
	private ConverterHandler getConverterHandlerMock() {
		return new DefaultConverterHandlerImpl();
	}
	
	@Test
	public void testAssemblyBeanFromMap(){
		BeanMap origem = new BeanMap();
		
		origem.put("name", "Rafael Noronha");
		origem.put("sexo.cdSexo", "1");
		origem.put("documentoPrincipal.tipoDocumento.descricao", "CPF");
		origem.put("estadoCivil.cdEstadoCivil", "1");
		origem.put("listaDocumentos[0].tipoDocumento.cdTipoDocumento", "2");
		origem.put("listaDocumentos[1].tipoDocumento.cdTipoDocumento", "3");
		origem.put("listaDocumentos[0].tipoDocumento.descricao", "teste");
		origem.put("listaDocumentos[3].valor", "xpto");
		origem.put("listaDocumentos[3].pessoa.nome", "name pessoa");
		
		origem.put("listaDocumentos[2].tipoDocumento.descricao", "item 02");
		origem.put("listaDocumentos[3].tipoDocumento.descricao", "item 03");
		origem.put("listaDocumentos[4].tipoDocumento.cdTipoDocumento", "4");
		
		Pessoa pessoa = (Pessoa)BeanMapUtils.assemblyBeanFromMap(new Pessoa(), origem, getConverterHandlerMock(), new Locale("pt", "Br"), getConverterLocatorMock());
		
		//asserts.
		Assert.assertTrue( pessoa.getNome().equals(origem.get("name")) );
		Assert.assertNotNull( pessoa.getSexo() );
		Assert.assertNotNull( pessoa.getEstadoCivil() );
		Assert.assertNotNull( pessoa.getDocumentoPrincipal() );
		Assert.assertNotNull( pessoa.getListaDocumentos() );
		Assert.assertTrue( pessoa.getListaDocumentos().size() == 5 );
		Assert.assertNotNull( pessoa.getListaDocumentos().get(0).getTipoDocumento() );
		Assert.assertNotNull( pessoa.getListaDocumentos().get(0).getTipoDocumento().getCdTipoDocumento() );
		
		Assert.assertEquals(pessoa.getListaDocumentos().get(0).getTipoDocumento().getCdTipoDocumento(), new Long(2) );
		Assert.assertEquals(pessoa.getListaDocumentos().get(0).getTipoDocumento().getDescricao(), "TipoDocumentoPessoa - Bean retornado do mecanismo de persistencia" );
		
		Assert.assertEquals(pessoa.getListaDocumentos().get(1).getTipoDocumento().getCdTipoDocumento(), new Long(3) );
		Assert.assertNotNull( pessoa.getListaDocumentos().get(1).getTipoDocumento().getDescricao() );
		
		Assert.assertEquals(pessoa.getListaDocumentos().get(2).getTipoDocumento().getDescricao(), "item 02" );
		
		Assert.assertEquals(pessoa.getListaDocumentos().get(3).getTipoDocumento().getDescricao(), "item 03" );
		Assert.assertEquals(pessoa.getListaDocumentos().get(3).getValor(), "xpto" );
		Assert.assertEquals(pessoa.getListaDocumentos().get(3).getPessoa().getNome(), "name pessoa" );
		
		Assert.assertEquals(pessoa.getListaDocumentos().get(4).getTipoDocumento().getCdTipoDocumento(), new Long(4) );
		Assert.assertTrue( pessoa.getSexo().getDescricao().equals("Masculino - Bean retornado do mecanismo de persistencia") );
		Assert.assertTrue( pessoa.getDocumentoPrincipal().getTipoDocumento().getDescricao().equals("CPF") );
	}

	@SuppressWarnings("unchecked")
	@Test
	public void testGetHierarchicalMap() {
		
		BeanMap beanMap = new BeanMap();
		
		//String
		beanMap.put("pessoa.sexo.descricao", "Masculino");
		beanMap.put("pessoa.nome", "Jose");
		beanMap.put("cdInscricao", "1");
		//Date
		Date dataNascimento = new Date();
		beanMap.put("pessoa.dadosPessoaFisica.dataNascimento", dataNascimento);
		//Lista
		List<BeanMap> listaTelefone = new ArrayList<BeanMap>();
		BeanMap telefone = new BeanMap();
		telefone.put("ddd", "11");
		//telefone.put("tipoTelefone.cdTipoTelefone", "2");
		listaTelefone.add(telefone);
		beanMap.put("listaTelefone", listaTelefone);
		
		//
		BeanMap result = BeanMapUtils.getHierarchicalMap(beanMap);
		
		//compara os resultados
		BeanMap pessoa = result.getBeanMap("pessoa");
		Assert.assertNotNull(pessoa);
		Assert.assertEquals(pessoa.get("name"), "Jose");
		//sexo
		BeanMap sexo = pessoa.getBeanMap("sexo");
		Assert.assertNotNull(sexo);
		Assert.assertEquals(sexo.get("descricao"), "Masculino");
		//
		Assert.assertEquals(result.get("cdInscricao"), "1");
		//
		BeanMap dadosPessoaFisica = pessoa.getBeanMap("dadosPessoaFisica");
		Assert.assertNotNull(dadosPessoaFisica);
		Date dataNascimento2 = dadosPessoaFisica.getDate("dataNascimento");
		Assert.assertEquals(dataNascimento, dataNascimento2);
		//
		List<BeanMap> listaTelefone2 = result.getListBeanMap("listaTelefone");
		Assert.assertNotNull(listaTelefone2);
		Assert.assertEquals(listaTelefone, listaTelefone2);
		//
		BeanMap telefone2 = listaTelefone2.get(0);
		Assert.assertNotNull(telefone2);
		Assert.assertEquals(telefone, telefone2);
		//tipoTelefone
		//BeanMap tipoTelefone = telefone2.getBeanMap("tipoTelefone");
		//Assert.assertNotNull(tipoTelefone);
		//Assert.assertEquals(tipoTelefone.getString("cdTipoTelefone"), "2");
	}

}
